﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Runtime.Serialization;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Configuration;

namespace KasaTakip
{
    [Serializable()]
    public class Database : ISerializable
    {
        List<Kasa> _kasalar = new List<Kasa>();
        List<Kasiyer> _kasiyer = new List<Kasiyer>();
        List<Magaza> _magazalar = new List<Magaza>();
        List<Cari> _cariler = new List<Cari>();
        List<Banka> _bankalar = new List<Banka>();
        List<ParaBirimi> _paraBirimleri = new List<ParaBirimi>();
        List<MasrafTanim> _masrafKartlari = new List<MasrafTanim>();

        List<AcikHesapHareketi> _acikhesaphareketleri = new List<AcikHesapHareketi>();
        List<BankaHareketi> _bankahareketleri = new List<BankaHareketi>();
        List<CariTahsilatHareketi> _caritahsilathareketleri = new List<CariTahsilatHareketi>();
        List<MasrafHareketi> _masrafhareketleri = new List<MasrafHareketi>();
        List<ZRaporu> _zraporlari = new List<ZRaporu>();
        List<NakitHareketi> _nakitdetaylari = new List<NakitHareketi>();
        List<KasaKapanisi> _closures = new List<KasaKapanisi>();
        List<MasrafFatura> _masrafFaturalari = new List<MasrafFatura>();


        public List<Kasa> Kasalar { get { return _kasalar; } set { _kasalar = value; } }
        public List<Kasiyer> Kasiyerler { get { return _kasiyer; } set { _kasiyer = value; } }
        public List<Magaza> Magazalar { get { return _magazalar; } set { _magazalar = value; } }
        public List<Cari> Cariler { get { return _cariler; } set { _cariler = value; } }
        public List<Banka> Bankalar { get { return _bankalar; } set { _bankalar = value; } }
        public List<MasrafTanim> MasrafKartlari { get { return _masrafKartlari; } set { _masrafKartlari = value; } }
        public List<ParaBirimi> ParaBirimleri { get { return _paraBirimleri; } set { _paraBirimleri = value; } }
        public List<AcikHesapHareketi> AcikHesapHareketleri { get { return _acikhesaphareketleri; } set { _acikhesaphareketleri = value; } }
        public List<BankaHareketi> BankaHareketleri { get { return _bankahareketleri; } set { _bankahareketleri = value; } }
        public List<CariTahsilatHareketi> CariTahsilatHareketleri { get { return _caritahsilathareketleri; } set { _caritahsilathareketleri = value; } }
        public List<MasrafHareketi> MasrafHareketleri { get { return _masrafhareketleri; } set { _masrafhareketleri = value; } }
        public List<ZRaporu> ZRaporlari { get { return _zraporlari; } set { _zraporlari = value; } }
        public List<NakitHareketi> NakitDetaylari { get { return _nakitdetaylari; } set { _nakitdetaylari = value; } }
        public List<KasaKapanisi> Closures { get { return _closures; } set { _closures = value; } }
        public List<MasrafFatura> MasrafFaturalari { get { return _masrafFaturalari; } set { _masrafFaturalari = value; } }

        public Database() { }
        public Database(SerializationInfo info, StreamingContext ctxt)
        {
            Kasalar = (List<Kasa>)info.GetValue("Kasalar", typeof(List<Kasa>));
            Kasiyerler = (List<Kasiyer>)info.GetValue("Kasiyerler", typeof(List<Kasiyer>));
            Magazalar = (List<Magaza>)info.GetValue("Magazalar", typeof(List<Magaza>));
            Cariler = (List<Cari>)info.GetValue("Cariler", typeof(List<Cari>));
            Bankalar = (List<Banka>)info.GetValue("Bankalar", typeof(List<Banka>));
            ParaBirimleri = (List<ParaBirimi>)info.GetValue("ParaBirimleri", typeof(List<ParaBirimi>));
            MasrafKartlari = (List<MasrafTanim>)info.GetValue("MasrafKartlari", typeof(List<MasrafTanim>));

            AcikHesapHareketleri = (List<AcikHesapHareketi>)info.GetValue("AcikHesapHareketleri", typeof(List<AcikHesapHareketi>));
            BankaHareketleri = (List<BankaHareketi>)info.GetValue("BankaHareketleri", typeof(List<BankaHareketi>));
            CariTahsilatHareketleri = (List<CariTahsilatHareketi>)info.GetValue("CariTahsilatHareketleri", typeof(List<CariTahsilatHareketi>));
            MasrafHareketleri = (List<MasrafHareketi>)info.GetValue("MasrafHareketleri", typeof(List<MasrafHareketi>));
            ZRaporlari = (List<ZRaporu>)info.GetValue("ZRaporlari", typeof(List<ZRaporu>));
            NakitDetaylari = (List<NakitHareketi>)info.GetValue("NakitDetaylari", typeof(List<NakitHareketi>));
            Closures = (List<KasaKapanisi>)info.GetValue("Closures", typeof(List<KasaKapanisi>));
            MasrafFaturalari = (List<MasrafFatura>)info.GetValue("MasrafFaturalari", typeof(List<MasrafFatura>));
        }

        public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue("Kasalar", this.Kasalar);
            info.AddValue("Kasiyerler", this.Kasiyerler);
            info.AddValue("Magazalar", this.Magazalar);
            info.AddValue("Cariler", this.Cariler);
            info.AddValue("Bankalar", this.Bankalar);
            info.AddValue("ParaBirimleri", this.ParaBirimleri);
            info.AddValue("MasrafKartlari", this.MasrafKartlari);


            info.AddValue("AcikHesapHareketleri", this.AcikHesapHareketleri);
            info.AddValue("BankaHareketleri", this.BankaHareketleri);
            info.AddValue("CariTahsilatHareketleri", this.CariTahsilatHareketleri);
            info.AddValue("MasrafHareketleri", this.MasrafHareketleri);
            info.AddValue("ZRaporlari", this.ZRaporlari);
            info.AddValue("NakitDetaylari", this.NakitDetaylari);
            info.AddValue("Closures", this.Closures);
            info.AddValue("MasrafFaturalari", this.MasrafFaturalari);
        }
    }

    public class ComboItem
    {
        public string Text { get; set; }
        public int ID { get; set; }
        public override string ToString()
        {
            return Text;
        }
    }

    public class Functions
    {
        public static Byte[] Serialize(Database db)
        {
            MemoryStream mem = new MemoryStream();
            BinaryFormatter bformatter = new BinaryFormatter();
            bformatter.Serialize(mem, db);
            mem.Close();
            return mem.ToArray();
        }

        public static Database DeSerialize(Byte[] data)
        {
            Database db = null;
            MemoryStream mem = new MemoryStream(data);
            BinaryFormatter bformatter = new BinaryFormatter();
            db = (Database)bformatter.Deserialize(mem);
            mem.Close();
            return db;
        }

        public static Database VtYukle(string Path)
        {
            Database db = null;
            try
            {
                if (File.Exists(Path + "\\DB.bin"))
                {
                    byte[] data = File.ReadAllBytes(Path + "\\DB.bin");
                    db = DeSerialize(data);
                }
                else
                    db = new Database();

                using (KasaEntity ent = new KasaEntity())
                {
                    foreach (var c in db.Closures)
                    {
                        KasaKapanisi cl = ent.KasaKapanislari.Where(x => x.KasaID == c.KasaID && x.KasiyerID == c.KasiyerID && x.MagazaID == c.MagazaID && x.Tarih == c.Tarih).FirstOrDefault();
                        if (cl != null)
                        {
                            cl.KasaFarki = c.KasaFarki;
                            cl.AcikHesapToplam = c.AcikHesapToplam;
                            cl.MasrafFaturalarToplam = c.MasrafFaturalarToplam;
                            cl.HarcamalarToplam = c.HarcamalarToplam;
                            cl.FaturaToplam = c.FaturaToplam;
                            cl.IadeToplam = c.IadeToplam;
                            cl.KrediToplam = c.KrediToplam;
                            cl.NakitToplam = c.NakitToplam;
                            cl.ZRaporToplam = c.ZRaporToplam;
                        }
                        else
                        {
                            cl = new KasaKapanisi()
                             {
                                 KasaFarki = c.KasaFarki,
                                 AcikHesapToplam = c.AcikHesapToplam,
                                 MasrafFaturalarToplam = c.MasrafFaturalarToplam,
                                 HarcamalarToplam = c.HarcamalarToplam,
                                 FaturaToplam = c.FaturaToplam,
                                 IadeToplam = c.IadeToplam,
                                 KasaID = c.KasaID,
                                 KasiyerID = c.KasiyerID,
                                 KrediToplam = c.KrediToplam,
                                 MagazaID = c.MagazaID,
                                 NakitToplam = c.NakitToplam,
                                 ZRaporToplam = c.ZRaporToplam,
                                 Tarih = c.Tarih
                             };

                            ent.AddToKasaKapanislari(cl);
                            cl = ent.KasaKapanislari.Where(x => x.KasaID == c.KasaID && x.KasiyerID == c.KasiyerID && x.MagazaID == c.MagazaID && x.Tarih == c.Tarih).FirstOrDefault();
                        }

                        //sil satırları
                        var lst = ent.ZRaporlari.Where(x => x.ClosureID == cl.ID).ToList();
                        foreach (var item in lst)
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.NakitHareketleri.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.BankaHareketleri.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.AcikHesapHareketleri.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.MasrafHareketleri.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.CariTahsilatHareketleri.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }
                        foreach (var item in ent.MasrafFaturalari.Where(x => x.ClosureID == cl.ID))
                        {
                            ent.DeleteObject(item);
                        }

                        ent.SaveChanges();

                        foreach (var z in db.ZRaporlari.Where(x => x.ClosureID == c.ID))
                        {
                            ZRaporu rpr = new ZRaporu();
                            rpr.FaturaAdedi = z.FaturaAdedi;
                            rpr.FaturaTutari = z.FaturaTutari;
                            rpr.FisAdedi = z.FisAdedi;
                            rpr.IadeAdedi = z.IadeAdedi;
                            rpr.IadeTutari = z.IadeTutari;
                            rpr.IndirimTutari = z.IndirimTutari;
                            rpr.ZNo = z.ZNo;
                            rpr.ZTutari = z.ZTutari;
                            rpr.ClosureID = cl.ID;
                            ent.AddToZRaporlari(rpr);
                        }

                        foreach (var n in db.NakitDetaylari.Where(x => x.ClosureID == c.ID))
                        {
                            NakitHareketi hr = new NakitHareketi();
                            hr.Miktar = n.Miktar;
                            hr.ParaCinsi = n.ParaCinsi;
                            hr.Tutar = n.Tutar;
                            hr.ClosureID = cl.ID;
                            ent.AddToNakitHareketleri(hr);
                        }

                        foreach (var b in db.BankaHareketleri.Where(x => x.ClosureID == c.ID))
                        {
                            BankaHareketi bh = new BankaHareketi();
                            bh.BankaID = b.BankaID;
                            bh.ClosureID = cl.ID;
                            bh.Tutar = b.Tutar;
                            bh.Slip = b.Slip;
                            ent.AddToBankaHareketleri(bh);
                        }

                        foreach (var a in db.AcikHesapHareketleri.Where(x => x.ClosureID == c.ID))
                        {
                            AcikHesapHareketi ac = new AcikHesapHareketi();
                            ac.CariID = a.CariID;
                            ac.ClosureID = cl.ID;
                            ac.KdvDahilTutar = a.KdvDahilTutar;
                            ac.KdvHaricTutar = a.KdvHaricTutar;
                            ac.BelgeNo = a.BelgeNo;
                            ent.AddToAcikHesapHareketleri(ac);
                        }

                        foreach (var h in db.MasrafHareketleri.Where(x => x.ClosureID == c.ID))
                        {
                            MasrafHareketi ms = new MasrafHareketi();
                            ms.Aciklama = h.Aciklama;
                            ms.ClosureID = cl.ID;
                            ms.Tutar = h.Tutar;
                            ent.AddToMasrafHareketleri(ms);
                        }

                        foreach (var ct in db.CariTahsilatHareketleri.Where(x => x.ClosureID == c.ID))
                        {
                            CariTahsilatHareketi ch = new CariTahsilatHareketi();
                            ch.BankaID = ct.BankaID;
                            ch.CariID = ct.BankaID;
                            ch.CekNo = ct.CekNo;
                            ch.ClosureID = cl.ID;
                            ch.Tutar = ct.Tutar;
                            ent.AddToCariTahsilatHareketleri(ch);
                        }

                        foreach (var dt in db.MasrafFaturalari.Where(x => x.ClosureID == c.ID))
                        {
                            MasrafFatura mf = new MasrafFatura();
                            mf.BelgeNo = dt.BelgeNo;
                            mf.CariID = dt.CariID;
                            mf.ClosureID = cl.ID;
                            mf.Fiyat = dt.Fiyat;
                            mf.MagazaNo = dt.MagazaNo;
                            mf.MasrafID = dt.MasrafID;
                            mf.Miktar = dt.Miktar;
                            mf.Tarih = dt.Tarih;
                            mf.Tutar = dt.Tutar;
                            ent.AddToMasrafFaturalari(mf);
                        }
                    }

                    try
                    {
                        ent.SaveChanges();
                        db.Closures.Clear();
                        db.ZRaporlari.Clear();
                        db.NakitDetaylari.Clear();
                        db.MasrafHareketleri.Clear();
                        db.AcikHesapHareketleri.Clear();
                        db.BankaHareketleri.Clear();
                        db.CariTahsilatHareketleri.Clear();
                        db.MasrafFaturalari.Clear();
                    }
                    catch (Exception)
                    {

                    }
                }
            }
            catch (Exception)
            {
                if (File.Exists(Path + "\\DB.bin"))
                {
                    File.Delete(Path + "\\DB.bin");
                    System.Windows.Forms.Application.Exit();
                }
            }

            try
            {
                using (KasaEntity ent = new KasaEntity())
                {
                    SabitBilgileriYukle(db, ent);
                }
            }
            catch (Exception)
            {

            }
            return db;
        }

        public static void SabitBilgileriYukle(Database db, KasaEntity ent)
        {
            int MagazaNo = Program.AktifDepoNo;
            db.Kasalar = ent.Kasalar.Where(x => x.MagazaNo == MagazaNo).ToList();
            db.Kasiyerler = ent.Kasiyerler.Where(x => x.MagazaNo == MagazaNo).ToList();
            db.Magazalar = ent.Magazalar.ToList();
            db.Bankalar = ent.Bankalar.ToList();
            db.Cariler = ent.Cariler.ToList();
            db.ParaBirimleri = ent.ParaBirimleri.ToList();
            db.MasrafKartlari = ent.MasrafTanimlari.Where(x => x.MagazaNo == MagazaNo).ToList();
        }

        public static void SaveDb(string Path, Database db)
        {
            byte[] data = Serialize(db);
            File.WriteAllBytes(Path + "\\DB.bin", data);
        }
    }

    public partial class Kasa
    {
        public override string ToString()
        {
            return this.No.ToString();
        }
    }

    public partial class Kasiyer
    {
        public override string ToString()
        {
            return this.KasiyerAdi.ToString();
        }
    }

    public partial class Magaza
    {
        public override string ToString()
        {
            return this.MagazaAdi;
        }
    }
}
